package sgeb;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Controlador alumnos Clase encargada de gestionar todas las acciones
 * referentes a los alumnos: 1) Insercción, borrado, consulta y modificación de
 * alumnos 2) Notificaciones a alumnos 3) Gestión de los pagos de los alumnos 4)
 * Gestión de las actividades extras
 *
 * @author Borja Molina Zea
 */
public class ControlAlumnos implements ActionListener {

    private VistaAdmin vistaAdministrativo;

    /**
     * Constructor de la clase
     *
     * @param vista Vista con al que trabajará el controlador
     * @author Borja Molina
     */
    public ControlAlumnos(VistaAdmin vista) {
	this.vistaAdministrativo = vista;
    }

    /**
     * Inserta un nuevo alumno en el sistema
     *
     * @param nombre
     * @param apellidos
     * @param fechaNacimiento
     * @param direccion
     * @param fechaIngreso
     * @param localidad
     * @param provincia
     * @param cp
     * @param telFijo
     * @param telMovil
     * @param cuentaBancaria
     * @param correo
     * @param sexo
     * @param colegio
     * @param experiencia
     * @param antiguoEquipo
     * @param talla
     * @param categoria
     * @param dni_tutor
     * @param nombreTutor
     * @return Identificador del alumno ingresado en el sistema
     * @author Borja Molina
     */
    public int altaAlumno(String nombre, String apellidos, Date fechaNacimiento, String direccion, Date fechaIngreso, String localidad, String provincia, int cp, int telFijo, int telMovil, String cuentaBancaria, String correo, String sexo, String colegio, int experiencia, String antiguoEquipo, String talla, String categoria, String dni_tutor, String nombreTutor, int equipo_id, int dorsal) {
	Alumno nuevoAlumno;
	nuevoAlumno = new Alumno(categoria, colegio, experiencia, talla, nombreTutor, dni_tutor, nombre, apellidos, null, direccion, localidad, provincia, cp, null, telFijo, telMovil, correo, sexo, cuentaBancaria, dorsal);
	int id = nuevoAlumno.guardarAlum();
	this.modificarAlumno(nombre, apellidos, fechaNacimiento, direccion, localidad, provincia, cp, fechaIngreso, telFijo, telMovil, cuentaBancaria, correo, sexo, categoria, colegio, experiencia, talla, nombreTutor, dni_tutor, id, equipo_id, dorsal);
	//Creamos el pago asociado al alumno
	new Pago().guardarPago(id);
	//System.out.println(nuevoAlumno.getCuentaBancaria());
	return id;
    }

    /**
     * Consulta los datos de un alumno Ojo! la recuperación de la fehca de
     * nacimiento no está implementada
     *
     * @param idAlumno Identificador del alumno a consultar
     * @return datos
     * @return null si no lo encuentra
     */
    public String[] consultarAlumno(int idAlumno) {
	try {
	    String[] datosAlu = new String[23];
	    Alumno alumnoConsultado = new Alumno(idAlumno);
	    datosAlu[0] = alumnoConsultado.getNombre();
	    datosAlu[1] = alumnoConsultado.getApellidos();

	    Date fechaNac = alumnoConsultado.getFechaNacimiento();
	    //datosAlu[2] = Integer.toString(fechaNac.getDay());
	    //datosAlu[3] = Integer.toString(fechaNac.getMonth());
	    //datosAlu[4] = Integer.toString(fechaNac.getYear());

	    //datosAlu[5] = 

	    datosAlu[6] = alumnoConsultado.getDireccion();
	    datosAlu[7] = alumnoConsultado.getLocalidad();
	    datosAlu[9] = Integer.toString(alumnoConsultado.getCp());
	    datosAlu[8] = alumnoConsultado.getProvincia();

	    datosAlu[10] = alumnoConsultado.getNombreTutor();
	    datosAlu[11] = alumnoConsultado.getDniTutor();
	    datosAlu[12] = Integer.toString(alumnoConsultado.getTefFijo());
	    datosAlu[13] = Integer.toString(alumnoConsultado.getTefMovil());
	    datosAlu[14] = alumnoConsultado.getCorreo();
	    datosAlu[15] = alumnoConsultado.getCuentaBancaria();

	    datosAlu[16] = alumnoConsultado.getColegio();
	    datosAlu[17] = Integer.toString(alumnoConsultado.getExperiencia());
	    datosAlu[18] = alumnoConsultado.getAntiguoEquipo();
	    datosAlu[19] = alumnoConsultado.getTalla();
	    datosAlu[20] = alumnoConsultado.getCategoria();
	    datosAlu[21] = alumnoConsultado.getSexo();
	    datosAlu[22] = Integer.toString(alumnoConsultado.getDorsal());
	    System.out.println("Dorsal: ");
	    System.out.println(datosAlu[22]);

	    if (datosAlu[0].equals(null)) {
		datosAlu = null;
	    }
	    return datosAlu;
	} catch (NullPointerException e) {
	    return null;
	}
    }

    /**
     * Da de baja un alumno del sistema
     *
     * @param id Identificador del alumno a dar de baja
     * @return true si no ha habido ningún fallo
     * @author Borja Molina Zea
     */
    public boolean bajaAlumno(int id) {
	return new Alumno().bajaAlumno(id);
    }

    /**
     * Modifica un alumno Ojo! la función no esta testeada
     *
     * @param nombre
     * @param apellidos
     * @param fechaNacimiento
     * @param direccion
     * @param localidad
     * @param provincia
     * @param cp
     * @param fechaIngreso
     * @param telFijo
     * @param telMovil
     * @param cuentaBancaria
     * @param correo
     * @param categoria
     * @param colegio
     * @param experiencia
     * @param talla
     * @param nombreTutor
     * @param dniTutor
     * @param id Identificador del alumno a consultar
     * @return true si no ha habido ningún eroor
     * @author Borja Molina
     */
    public boolean modificarAlumno(String nombre, String apellidos, Date fechaNacimiento, String direccion, String localidad, String provincia, int cp, Date fechaIngreso, int telFijo, int telMovil, String cuentaBancaria, String correo, String sexo, String categoria, String colegio, int experiencia, String talla, String nombreTutor, String dniTutor, int id, int equipo_id, int dorsal) {
	return new Alumno().modificarAlumno(nombre, apellidos, fechaNacimiento, direccion, localidad, provincia, cp, fechaIngreso, telFijo, telMovil, cuentaBancaria, correo, sexo, categoria, colegio, experiencia, talla, nombreTutor, dniTutor, id, equipo_id, dorsal);
    }

    /**
     * Busca el correo de un alumno
     *
     * @param id Identificador del alumno
     * @return correo de contacto del alumno
     * @author Borja Molina
     */
    public String buscarCorreo(int id) {
	Alumno alumnoConsultado = new Alumno(id);
	String correo = alumnoConsultado.getCorreo();
	return correo;
    }

    /**
     * Envia un correo a un alumno
     *
     * @param correo mail de alumno
     * @param asunto Asunto del correo
     * @param cuerpo Cuerpo del correo
     * @return true si no ha habido ningún error
     * @author Borja Molina
     */
    public boolean enviarCorreo(String correo, String asunto, String cuerpo) {
	MailSender EnviadorMail = new MailSender(correo, asunto, cuerpo);
	return true;
    }

    /**
     * En construccion
     *
     * @param id
     * @param pagos
     * @return
     */
    public boolean modificarPago(int id, int[] pagos) {
	try {
	    Pago pagoAConsultar = new Pago(id);
	    for (int i = 0; i < 10; i++) {
		System.out.println(pagos[1]);
		pagoAConsultar.setPago(i, pagos[i]);
	    }
	    pagoAConsultar.actualizarPago(id);
	    return true;
	} catch (Exception e) {
	    return false;
	}
    }

    public boolean borrarPagos(int id) {
	try {
	    new Pago().borrarPago(id);
	    return true;
	} catch (Exception e) {
	    return false;
	}
    }

    public int[] consultarPagos(int id) {
	System.out.printf("entro en cosultar pagos %d\n", id);
	int[] pagos = new int[10];
	Pago pagoAconsultar = new Pago(id);
	for (int i = 0; i < 10; i++) {
	    pagos[i] = pagoAconsultar.getPago(i);
	}
	this.vistaAdministrativo.setDatosPagos(pagos);
	return pagos;
    }

    /**
     * Inicia los listener de los botones de la vista
     */
    public void iniciar() {
	this.vistaAdministrativo.setVisible(true);
	this.vistaAdministrativo.botonGuardarAlumno.setActionCommand("Guardar alumno");
	this.vistaAdministrativo.botonBuscarAlumno.setActionCommand("Buscar alumno");
	this.vistaAdministrativo.botonBorrarAlumno.setActionCommand("Borrar alumno");
	this.vistaAdministrativo.botonBuscarAlumnoNotificacion.setActionCommand("Notificacion");
	this.vistaAdministrativo.botonEviarCorreo.setActionCommand("Enviar Notificacion");
	this.vistaAdministrativo.seleccionCategoria.setActionCommand("Consultar equipos");
	this.vistaAdministrativo.seleccionEquipo.setActionCommand("Elegir equipo");
	this.vistaAdministrativo.botonGuardarPagos.setActionCommand("Modificar pagos");

	this.vistaAdministrativo.botonGuardarAlumno.addActionListener(this);
	this.vistaAdministrativo.botonBuscarAlumno.addActionListener(this);
	this.vistaAdministrativo.botonBorrarAlumno.addActionListener(this);
	this.vistaAdministrativo.botonBuscarAlumnoNotificacion.addActionListener(this);
	this.vistaAdministrativo.botonEviarCorreo.addActionListener(this);
	this.vistaAdministrativo.seleccionCategoria.addActionListener(this);
	this.vistaAdministrativo.seleccionEquipo.addActionListener(this);
	this.vistaAdministrativo.botonGuardarPagos.addActionListener(this);
    }

    /**
     * Da la funcionalidad a cada uno de los botones
     *
     * @param e Evento que dispara las distinta acciones
     * @author Borja Molina
     */
    public void actionPerformed(ActionEvent e) {
	String comando = e.getActionCommand();
	if (comando.equals("Guardar alumno")) {
	    //Si vamos agregar uno nuevo
	    if (this.vistaAdministrativo.ultimoBotonPulsado() == 8) {
		String[] datosAlu = this.vistaAdministrativo.getDatosAlumno();
		//Date fechaNacimiento = new Date(Integer.parseInt(datosAlu[4]), Integer.parseInt(datosAlu[3]), Integer.parseInt(datosAlu[2]));
		//Date fechaActual = new Date();
		String categoria = this.vistaAdministrativo.seleccionCategoria.getSelectedItem().toString();
		String[][] equipos = new Equipo().GetEquipos(categoria);
		String[] salida = new String[equipos.length];
		int id_equipo = -1;
		for (int i = 0; i < equipos.length; i++) {
		    salida[i] = equipos[i][1];
		}
		if (this.vistaAdministrativo.seleccionEquipo.getSelectedItem() != "") {
		    int indice = this.vistaAdministrativo.seleccionEquipo.getSelectedIndex();
		    id_equipo = Integer.parseInt(equipos[indice][0]);
		    System.out.println(equipos[indice][0]);
		}

		//			    nombre	apellidos	 direccion	    localidad	provincia		cp			    telFijo				telMovil		    cuentaBancaria		correo		sexo	    colegio	    experiencia			antiguoEquipo	talla	    categoria	    dni_tutor	nombreTutor
		int id = this.altaAlumno(datosAlu[0], datosAlu[1], null, datosAlu[5], null, datosAlu[6], datosAlu[8], Integer.parseInt(datosAlu[7]), Integer.parseInt(datosAlu[11]), Integer.parseInt(datosAlu[12]), datosAlu[20], datosAlu[13], datosAlu[21], datosAlu[14], Integer.parseInt(datosAlu[15]), datosAlu[16], datosAlu[17], datosAlu[18], datosAlu[10], datosAlu[9], id_equipo, Integer.parseInt(datosAlu[22]));
		this.vistaAdministrativo.mostrarNSocio(id);
	    }
	    //Si el alumno ya está agregado y lo que queremos es modificarlo
	    // OJO!! esta parte no funciona, hay que arreglarla
	    if (this.vistaAdministrativo.ultimoBotonPulsado() == 7) {
		String[] datosAlu = this.vistaAdministrativo.getDatosAlumno();

		String categoria = this.vistaAdministrativo.seleccionCategoria.getSelectedItem().toString();
		String[][] equipos = new Equipo().GetEquipos(categoria);
		String[] salida = new String[equipos.length];
		int id_equipo = -1;
		for (int i = 0; i < equipos.length; i++) {
		    salida[i] = equipos[i][1];
		}
		if (this.vistaAdministrativo.seleccionEquipo.getSelectedItem() != "") {
		    int indice = this.vistaAdministrativo.seleccionEquipo.getSelectedIndex();
		    id_equipo = Integer.parseInt(equipos[indice][0]);
		    System.out.println(equipos[indice][0]);
		}
		//			nombre	    apellidos	     direccion	    localidad	provincia		    cp				 telFijo			    telMovil		    cuentaBancaria	    correo	sexo	    categoria	colegio		    experiencia			talla	 nombreTutor	dniTutor		    id - Identificador del alumno a consultar
		if(this.modificarAlumno(datosAlu[0], datosAlu[1], null, datosAlu[5], datosAlu[6], datosAlu[8], Integer.parseInt(datosAlu[7]), null, Integer.parseInt(datosAlu[11]), Integer.parseInt(datosAlu[12]), datosAlu[20], datosAlu[13], datosAlu[21], datosAlu[18], datosAlu[14], Integer.parseInt(datosAlu[15]), datosAlu[17], datosAlu[9], datosAlu[10], this.vistaAdministrativo.idSeleccionado(), id_equipo, Integer.parseInt(datosAlu[22]))){
		    this.vistaAdministrativo.insertarPanel(this.vistaAdministrativo.PanelAlumnoGuardado);
		}
	    }
	}

	if (comando.equals("Buscar alumno")) {
	    int id = Integer.parseInt(this.vistaAdministrativo.campoIdAlumno.getText());
	    String[] datosAlu = this.consultarAlumno(id);
	    this.consultarPagos(id);
	    if (datosAlu != null) {
		this.vistaAdministrativo.setDatosAlumno(datosAlu);
	    } else {
		this.vistaAdministrativo.flag_alumno_no_encontrado = true;
	    }
	}

	if (comando.equals("Borrar alumno")) {
	    String StringId = this.vistaAdministrativo.campoIdAlumno.getText();
	    if (!StringId.equals("")) {
		int id = Integer.parseInt(StringId);
		if (id > -1) {
		    this.bajaAlumno(id);
		    this.borrarPagos(id);
		    this.vistaAdministrativo.insertarPanel(this.vistaAdministrativo.PanelAlumnoBorrado);
		}
	    }
	}

	//Para entrar en el palnel de notificaciones
	if (comando.equals("Notificacion")) {
	    String StringId = this.vistaAdministrativo.campoIdNotificacionId.getText();
	    if (!StringId.equals("")) {
		int id = Integer.parseInt(StringId);
		if (id > -1) {
		    String mail = this.buscarCorreo(id);
		    this.vistaAdministrativo.mostrarNotificacion(mail);
		}
	    }
	}

	if (comando.equals("Enviar Notificacion")) {
	    String correo = this.vistaAdministrativo.campoMailEnviar.getText();
	    String asunto = this.vistaAdministrativo.campoAsuntoCorreo.getText();
	    String cuerpo = this.vistaAdministrativo.campoCuerpoCorreo.getText();
	    this.enviarCorreo(correo, asunto, cuerpo);
	    this.vistaAdministrativo.mostrarConfirmacionCorreo();
	}

	if (comando.equals("Consultar equipos")) {
	    String categoria = this.vistaAdministrativo.seleccionCategoria.getSelectedItem().toString();
	    String[][] equipos = new Equipo().GetEquipos(categoria);
	    String[] salida = new String[equipos.length];
	    for (int i = 0; i < equipos.length; i++) {
		salida[i] = equipos[i][1];
	    }
	    this.vistaAdministrativo.seleccionEquipo.setModel(new javax.swing.DefaultComboBoxModel(salida));
	}

	if (comando.equals("Modificar pagos")) {
	    System.out.println("entro en modificar pagos");
	    int id = this.vistaAdministrativo.idSeleccionado();
	    System.out.println(id);
	    int[] pagos = this.vistaAdministrativo.getDatosPagos();
	    //System.out.println(pagos[1]);
	    this.modificarPago(id, pagos);
	    this.vistaAdministrativo.insertarPanel(this.vistaAdministrativo.PanelPagoModificado);
	}

	if (comando.equals("Elegir equipo")) {
	    /*String categoria = this.vistaAdministrativo.seleccionCategoria.getSelectedItem().toString();
	     String[][] equipos = new Equipo().GetEquipos(categoria);
	     String[] salida = new String[equipos.length];
	     int id_equipo=-1;
	     for (int i = 0; i < equipos.length; i++) {
	     salida[i] = equipos[i][1];
	     }
	     if(this.vistaAdministrativo.seleccionEquipo.getSelectedItem()!=""){
	     int indice = this.vistaAdministrativo.seleccionEquipo.getSelectedIndex();
	     id_equipo=Integer.parseInt(equipos[indice][0]);
	     System.out.println(equipos[indice][0]);
	     }*/
	}

    }
}
